package com.tom.architect.party3.day32.simple2.rxlogin;

import android.app.Activity;
import android.content.Intent;

import com.tom.architect.party3.day32.simple2.rxlogin.umeng.SHARE_MEDIA;
import com.tom.architect.party3.day32.simple2.rxlogin.umeng.UMAuthListener;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import io.reactivex.Observable;
import io.reactivex.subjects.PublishSubject;

// 隔离+封装。采用响应式编程的思想。
public class RxLogin implements UMAuthListener {
    private Activity activity;
    static UMAuthListener staticListener; // 用于将结果回传出来。
    // 返回的结果。
    private RxLoginResult mRxLoginResult;
    // 操作符PublishSubject，发送结果出去。 发送工具
    private PublishSubject<RxLoginResult> mEmitter;

    // 不暴露构造函数
    private RxLogin(Activity activity) {
        this.activity = activity;
        staticListener = this;
        mRxLoginResult = new RxLoginResult();
        mEmitter = PublishSubject.create();
    }

    public static RxLogin create(Activity activity) {
        return new RxLogin(activity);
    }

    // 登录的回调，通过泛型来规范 返回的数据。
    public Observable<RxLoginResult> doOauthVerify(RxLoginPlatform platform) {
        // 开一个透明的activity【RxLoginActivity】， 参照rxPermission V0.2.0_ShadowActivity.java源码。便于拿到回调。
        Intent intent = new Intent(activity, RxLoginActivity.class);
        intent.putExtra(RxLoginActivity.PLATFORM_KEY, platform); // 传递过去，用什么平台登录。
        activity.startActivity(intent);
        // 去掉系统默认的切换动画
        activity.overridePendingTransition(0, 0);

        mRxLoginResult.setPlatform(platform); // 设置平台
        List<Observable<RxLoginResult>> list = new ArrayList<>(1); // 确定长度1，只传递一个值。
        list.add(mEmitter);
        return Observable.concat(Observable.fromIterable(list)); // 发送结果出去
    }

    @Override
    public void onStart(SHARE_MEDIA share_media) {
        // 不要复写。
    }

    @Override
    public void onComplete(SHARE_MEDIA share_media, int i, Map<String, String> map) {
        // 设置result里面的值
        mRxLoginResult.setSucceed(true);
        mRxLoginResult.setUserInfoMaps(map);
        mRxLoginResult.setMsg("第三方登录，从map中，获取信息成功");

        // 拿到结果信息，回调到 Activity的 Consumer:accept(RxLoginResult result) 方法中。
        mEmitter.onNext(mRxLoginResult);
    }

    @Override
    public void onError(SHARE_MEDIA share_media, int i, Throwable throwable) {
        mRxLoginResult.setSucceed(false);
        mRxLoginResult.setMsg("分享error，获取用户信息失败");
        throwable.printStackTrace();
        mEmitter.onNext(mRxLoginResult);
    }

    @Override
    public void onCancel(SHARE_MEDIA share_media, int i) {
        mRxLoginResult.setSucceed(false);
        mRxLoginResult.setMsg("已经取消第三方登录");
        mEmitter.onNext(mRxLoginResult);
    }
}
